package cn.zxy.tokenx.interceptor;

import cn.hutool.core.util.StrUtil;
import cn.hutool.jwt.JWTPayload;
import cn.hutool.jwt.JWTUtil;

import cn.zxy.exception.BizException;

import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.nio.charset.StandardCharsets;

public class TokenInterceptor implements HandlerInterceptor {

//    @Value("${token.key}")
//    private String tokenKey;
//    因为此处没有容器，所以直接放到WebConfig容器里面
//    只有在容器里面的类，才能通过@Value注解 把属性注入进去

//    注入进去的属性再传过来就可以使用了
    private String tokenKey;

    public TokenInterceptor(String tokenKey){
        this.tokenKey = tokenKey;
    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        String token = request.getHeader("token");

        if(StrUtil.isEmpty(token)){
            throw new BizException(401,"token 必传");
        }
//        if (token.equals("123")){
//            return true;
//        }

//        验证token
        boolean verify = false;
        try{
            verify = JWTUtil.verify(token, tokenKey.getBytes(StandardCharsets.UTF_8));
        }catch (Exception ex){
            ex.printStackTrace();
        }


        if(verify){

//         解析
            JWTPayload payload = JWTUtil.parseToken(token).getPayload();
//            LocalUser localUser = JSONUtil.toBean(payload.toString(), LocalUser.class);
            //localUser 如何存储，才能够在其他类或其他方法直接使用？

            return true;
        }

        throw new BizException(401,"token 不正确");
    }
}
